package studyNote;
// 1. 定义抽象类
abstract class Shape {
    // 抽象方法：没有方法体，以分号结束，必须由子类实现
    public abstract double calculateArea();

    // 抽象方法：计算周长
    public abstract double calculatePerimeter();

    // 普通方法（有具体实现）
    public void display() {
        System.out.println("这是一个图形。");
    }
}

// 2. 继承抽象类的子类：矩形
class Rectangle extends Shape {
    private final double width;
    private final double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // 实现父类的抽象方法
    @Override
    public double calculateArea() {
        return width * height;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * (width + height);
    }
}

// 3. 继承抽象类的子类：圆形
class Circle extends Shape {
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // 实现父类的抽象方法
    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * Math.PI * radius;
    }
}

// 4. 测试类
public class AbstractClass {
    public static void main(String[] args) {
        // 创建具体对象
        Shape rectangle = new Rectangle(4.0, 5.0);
        Circle circle = new Circle(3.0);

        // 调用方法
        rectangle.display(); // 输出：这是一个图形。
        System.out.println("矩形面积: " + rectangle.calculateArea()); // 20.0
        System.out.println("矩形周长: " + rectangle.calculatePerimeter()); // 18.0

        circle.display(); // 输出：这是一个图形。
        System.out.println("圆形面积: " + circle.calculateArea()); // 约 28.27
        System.out.println("圆形周长: " + circle.calculatePerimeter()); // 约 18.85
    }
}
